cmp V2.0 (2000-11-26)

cmp ist ein Programm, welches Dateien in zwei Verzeichnissen (oder Bäumen) vergleicht. Dies kann sehr nützlich sein, um z.B. bei einem Backup zu untersuchen, welche Dateien sich geändert haben bzw. hinzugekommen sind.

cmp ist auch in der Lage, zwei Dateien zu vergleichen und die Unterschiede darzustellen (Hex-Dump).

Mit cmp und dem device-handler (AmiNet:disk/misc/dev_hdl.lha) können Sie auch Disketten und Festplatten Byte für Byte vergleichen.

Die neueste Version findet man hier:
http://www.kazik.de/alex/cmp
Meine HomePage: http://www.kazik.de/alex/



Inhaltsverzeichnis



Systemvoraussetzung

AmigaOS 2.1 oder höher.


Installation

Kopieren Sie das Programm und die Dokumentation dahin, wo es Ihnen am liebsten ist.


Rechtliches
This software is subject to the "Standard Amiga FD-Software Copyright Note".
It is GIFTWARE/MAILWARE as defined in paragraph 4g/4b.
For more information please read "AFD-COPYRIGHT" (Version 1.4 or higher).



Benutzung

Seit V2.0 ist cmp lokalisiert. Alle hier dargestellen texte, sind die englischen!

Durch die ersten beiden Parameter muß cmp übergeben werden, was verglichen werden soll. Die Parameter können sein:
Hinweis: Eine Datei kann nicht mit einem Pattern verglichen werden.

Bei einem Vergleich können die folgenden Ereignisse eintreten:
Q:Die beiden Dateien sind gleich (equal).
L:Die beiden Dateien unterscheiden sich in der Länge (length).
C:Die beiden Dateien sind gleich lang, unterscheiden sich aber im Inhalt (contents).
D:Die beiden Dateien unterscheiden sich in Länge und Inhalt (different).
A:Eine Datei/Verzeichnis im Verzeichnis (-Baum) B gibt es nicht in A.
B:Eine Datei/Verzeichnis im Verzeichnis (-Baum) A gibt es nicht in B.
W:Es wurde versucht eine Datei mit einem Verzeichnis zu vergleichen (object wrong type).
E:Es trat ein sonstiger Fehler auf, z.B. ein Lesefehler (error).
S:Die Datei A ist eine verkürzte Version von Datei B (A is truncated). *L
T:Die Datei B ist eine verkürzte Version von Datei A (B is truncated). *L
O:Die Datei-Kommentare stimmen nicht überein (comment). *O
P:Die Protection-Bits stimmen nicht überein. *P
0:Fehlermeldung 212: Objekt ist nicht vom geforderten Typ (A=DIR, B=FILE) *W
1:Fehlermeldung 212: Objekt ist nicht vom geforderten Typ (A=FILE, B=DIR) *W
2:Fehlermeldung 205: Objekt nicht gefunden (A=DIR, B=-) *A
3:Fehlermeldung 205: Objekt nicht gefunden (A=FILE, B=-) *A
4:Fehlermeldung 205: Objekt nicht gefunden (A=-, B=DIR) *B
5:Fehlermeldung 205: Objekt nicht gefunden (A=-, B=FILE) *B
6:Fehlermeldung 205: Objekt nicht gefunden (A=NEWDIR) *N
7:Fehlermeldung 205: Objekt nicht gefunden (A=NEWFILE) *N
8:Fehlermeldung 205: Objekt nicht gefunden (B=NEWDIR) *N
9:Fehlermeldung 205: Objekt nicht gefunden (B=NEWFILE) *N

*L, *W, *A, *B = Durch die Aktivierung der Option DETAIL werden die Ergebnisse LWAB durch die präziseren ST012345 ersetzt.

*N = Durch die Optionen NEWDIR/NEWFILE neu hinzugekommene Ereignisse.

*O = Durch die Option COMMENT neu hinzugekommenes Ereignis.

*P = Durch die Option PRTOBITS neu hinzugekommenes Ereignis.

Wenn in folgenden Aufzählungen die neuen Optionen fehlen, werden sie wie ihre einfachere Variante gehandhabt. Wobei N wie A/B angesehen wird.

Hier werden nun die wichtigsten Parameter angesprochen, die genaue Benutzung entnehmen Sie bitte der folgenden Seite. Alle Parameter sind fett und GROß geschrieben.

Für cmp ist eine erweiterte Hilfe verfügbar: Rufen Sie cmp (in einem CLI) mit dem Parameter "?" auf und geben bei der folgenden Aufforderung noch ein "?" ein.

Die Ausgabe von cmp ergibt sich wie folgt:
Wenn die beiden Dateien inhaltlich unterschieden werden sollen (C,D) und eine Ausgabe des Unterschiedes gewünscht wird, gibt ein Hex-Dump die unterschiedlichen Zeilen aus. Die Unterschiede werden weiß dargestellt ( Beispiel ). Dieser Hex-Dump kann durch die Option DUMP ein- und ausgeschaltet werden. Bei einem Vergleich zweier Dateien ist der Hex-Dump standardmäßig eingeschaltet.
Ein Hex-Dump kann mit CTRL-D abgebrochen werden, der Vergleich wird aber fortgesetzt.
Wenn die Option DUMP ausgeschaltet ist, werden die Dateien, die sich in der Länge unterscheiden nicht auf verschiedene Inhalte hin untersucht. Siehe auch CHECKD.

Nach der Hex-Dump-Ausgabe (falls eingeschaltet) wird der Dateiname und das Ergebnis in Klartext ausgegeben. Der Text ist je nach Ergebnis einer der folgenden:
Q:[kein Text]
L:Difference in length
C:Difference in contents
D:Difference in length&contents
A,B,W,E:The corresponding error messages (see above), since workbench 2.1 localized.

Weitere Ereignisse finden Sie hier .

Hinweis: Dateien die gleich lang sind und ein identisches Datum tragen, werden von cmp als gleich angesehen, und der Inhalt wird nicht untersucht. Siehe auch CHECKD.

Die Ausgabe kann über die Option LFORMAT vollständig den Wünschen des Benutzers angepaßt werden.

Nach Beendigung von cmp wird der Rückgabewert wie folgt gesetzt:
0:Alle Dateien sind gleich.
5:Eine oder mehrere Dateien sind unterschiedlich (LCDOP).
6:Die Datei A ist eine verkürzte Version von Datei B (S).
7:Die Datei B ist eine verkürzte Version von Datei A (T).
10:Eine oder mehrere Dateien wurden nicht gefunden / sind vom falschen Typ (ABW).
15:Ein sonstiger Fehler trat auf (E).
20:Ein schwerer Fehler trat auf / der Vergleich wurde abgebrochen.
Die Werte 5-15 werden nur gesetzt, wenn auch die Ausgabe gemacht wird (siehe SHOW). Siehe auch NORC.

Nach einem Vergleich von Verzeichnissen wird eine kurze Statistik angezeigt. Siehe auch NOSTAT.

Mit Hilfe der Option SHOW kann spezifiziert werden, welche Meldungen ausgegeben werden sollen.

Durch die Option ABORT kann cmp mitgeteilt werden, bei welchen Ereignissen der Vergleich abgebrochen werden soll.

Bei einem Vergleich zweier Verzeichnisse kann mit der Option ALL das rekursive Durchsuchen beider Verzeichnisbäume aktiviert werden.

Normalerweise werden Links auf Verzeichnisse komplett ignoriert. Lesen Sie hierzu HLINK und SLINK.

Die genaue Syntax der einzelnen Optionen entnehmen Sie bitte der folgenden Seite.


Parameter

Die Syntax für die Benutzung von cmp ist:
cmp A/A,B/A,ALL/S,SHOW/K,ABORT/K,DUMP/N,CHECKD/S,ONLYA/S,HLINK/S,SLINK/S, LFORMAT/F,NOSTAT/S,NORC/S,DETAIL/S,NEWDIR/N,NEWFILE/S,REVADIR/S,REVBDIR/S, DUMPALL/S,SKIPFIRSTNBYTES=SKIP/K/N,COMMENT=COM/K/N
Rufen Sie cmp mit "?" als Parameter auf, bekommen Sie die obige Syntaxzeile angezeigt und können dann noch Ihre Parameter angeben. Wenn Sie an dieser Stelle noch ein "?" eingeben, bekommen Sie die erweiterte Hilfe angezeigt.

A/ADie erste Datei/Verzeichnis/Pattern (siehe Benutzung).
B/ADie zweite Datei/Verzeichnis/Pattern (siehe Benutzung).
ALL/SDie beiden Verzeichnisse werden rekursiv verglichen.
SHOW/KWelche Ausgaben gemacht werden bzw. unterdrückt werden sollen. Anzugeben ist ein String, der alle zu machenden Ausgaben enthält. Die Ausgaben werden durch das Ergebnis-Kürzel (QLCDABWE) spezifiziert. Die Bedeutung der einzelnen Kürzel ist im Kapitel Benutzung beschrieben. Ein vorangestelltes "~" negiert die Eingabe. Standardmäßig wird alles angezeigt.
ABORT/KBei welchen Ergebnissen abgebrochen werden soll. Die Angaben entsprechen denen bei SHOW. Standardmäßig wird nie abgebrochen.
DUMP/NOb ein Hex-Dump ausgegeben werden soll. Bei einer positiven Zahl werden max. DUMP unterschiedliche Zeilen ausgegeben. Gleiche Zeilen werden nie angezeigt. Durch die Angabe einer negativen Zahl werden alle Unterschiede ausgegeben. Bei Angabe von 0 wird der Hex-Dump ausgeschaltet. Bei einem Vergleich zweier Dateien ist die Standardeinstellung -1, sonst 0.
Ein Hex-Dump kann durch CTRL-D abgebrochen werden, der Vergleich wird aber fortgesetzt.
CHECKD/SWenn zwei zu vergleichende Dateien eine unterschiedliche Länge haben, wird standardmäßig nicht untersucht, ob der Inhalt (bis zur Längendifferenz) gleich ist. Außerdem werden Dateien ebenfalls nicht untersucht, wenn Datum und Länge identisch sind. Mit dieser Option kann dies angeschaltet werden, macht aber meistens keinen Sinn und kostet nur Zeit. Diese Option wird automatisch aktiviert, wenn DUMP ungleich 0 ist.
ONLYA/SIm Normalfall werden bei einem Vergleich zweier Verzeichnisse alle Dateien (Verzeichnisse) in dem 1. Baum mit dem 2., und umgekehrt, verglichen. Bei eingeschalteter Option wird nur das 1. Verzeichnis durchsucht und mit dem 2. verglichen. Dateien/Verzeichnisse, die im 2. Verzeichnis auftauchen, aber nicht im 1., werden nicht angezeigt/durchsucht.
HLINK/SDa es durch Links möglich ist, eine zyklische Struktur zu erzeugen, die bei einem Vergleich nicht bemerkt wird, würde cmp im "Kreis" laufen, und nie enden. Deswegen werden Hardlinks auf Verzeichnisse normalerweise nicht verfolgt. Mit dieser Option kann das Verfolgen von Hardlinks auf Verzeichnisse aktiviert werden.
Links auf Dateien werden untersucht.
SLINK/SWie HLINK, ob Softlinks auf Verzeichnisse verfolgt werden sollen.
LFORMAT/FDies ist wohl die umfangreichste Option von cmp. Mit ihr kann das Aussehen der Ausgabe bestimmt werden. Allerdings nicht das Aussehen des Hex-Dumps. Wie dies genau funktioniert, lesen Sie auf der folgenden Seite.
NOSTAT/SDiese Option schaltet die Statistik aus.
NORC/SWenn diese Option eingeschaltet ist, ist der Rückgabewert außer bei schweren Fehlern oder Benutzer-Abbruch, immer 0.
Diese Option ist speziell für die Benutzung von cmp in DOpus und ARexx-Skripts, da dort Probleme oder unerwünschte Effekte mit Rückgabewerten ungleich null auftreten können.
DETAIL/SWenn diese Option angegeben wird, werden die Ergebnisse ABLW detailierter ausgegeben.
Hier die neuen Ereignisse für L: (Außerdem gibt es für diese beiden Fälle auch neue RC-Codes.)
S: Die Datei A ist eine verkürzte Version von Datei B (A is truncated).
T: Die Datei B ist eine verkürzte Version von Datei A (B is truncated).
Hier die neuen Ereignisse für W:
0: Fehlermeldung 212: Objekt ist nicht vom geforderten Typ (A=DIR, B=FILE)
1: Fehlermeldung 212: Objekt ist nicht vom geforderten Typ (A=FILE, B=DIR)
Hier die neuen Ereignisse für AB:
2: Fehlermeldung 205: Objekt nicht gefunden (A=DIR, B=-)
3: Fehlermeldung 205: Objekt nicht gefunden (A=FILE, B=-)
4: Fehlermeldung 205: Objekt nicht gefunden (A=-, B=DIR)
5: Fehlermeldung 205: Objekt nicht gefunden (A=-, B=FILE)
NEWDIR/NEs werden bis zur angegebenen Tiefe auch Verzeichnis-Strukturen, welche es im anderen Baum nicht gibt, ausgegeben. Nur sinvoll im Zusammenhang mit ALL. Eine Tiefe von <= 0 bedeutet unendlich! Hierfür gibt es neue Ereignisse ((68)). ( siehe Ausgabe )
Ein Beispiel für diese Option gibt es hier .
NEWFILE/SIn den durch NEWDIR ausgegebenen Verzeichnissen werden auch Dateien ausgegeben. Hierfür gibt es neue Ereignisse ((79)). ( siehe Ausgabe )
Ein Beispiel für diese Option gibt es hier .
REVADIR/S, REVBDIR/SNormalerweise werden bei NEWDIR und NEWFILE zuerst das Verzeichnis und dann alle Einträge ausgegeben, hiermit wird dies umgedreht.
Ein Beispiel für diese Option gibt es hier .
DUMPALL/SEs werden nicht nur die unterschiedlichen Zeilen, sondern alle ausgegeben.
SKIPFIRSTNBYTES=SKIP/K/NEs werden die ersten N Bytes in jeder Datei übersprungen. Es wird das Ergebnis L ausgegeben, wenn die Datei zu kurz ist.
COMMENT=COM/K/N
  • COM<0: Es werden nur Datei-Kommentare untersucht. (keine Inhalte, ...)
  • COM>0: Es werden bei identischem Inhalt auch noch die Datei-Kommentare untersucht.
  • COM=0: Kein Vergleich der Datei-Kommentare. (Voreinstellung)

Wenn COM 1 bzw. -1 ist, wird groß/klein-Schreibung nicht beachtet, ansonsten schon.

Im Fall einer Ungleichheit wird das Ergebnis O zurückgegeben.
PROTBITS/SWenn angegeben werden unterschiede in den Protection-Bits auch ausgegeben.



Ausgabe

Die Ausgabe kann durch die Option LFORMAT verändert werden.

Der Rest der Parameter von cmp wird automatisch als LFORMAT interpretiert. Es ist also nicht nötig, LFORMAT anzugeben und es ist auch nicht nötig, den Parameter in Anführungszeichen einzufassen.

Folgende Optionen werden in der Ausgabe unterstützt:
%nName
%pPfad (QLCD: ab Vergleich, ABWE: absolut)
%tPfad (QLCD: ab Vergleich, ABWE: mit vorangestelltem "A:"/"B:")
%PPfad + Name (siehe %p)
%TPfad + Name (siehe %t)
%eFehler als Text
%EFehler als Nummer
%rErgebnis (QLCDABWE)
%RPfad ab Vergleich
%aAbsoluter Pfad in A
%bAbsoluter Pfad in B
%%"%"
*n, *NEine neue Zeile wird eingefügt
*e, *EEin ESC-Zeichen wird eingefügt
**"*"

Den Ergebnissen werden folgende Fehlernummern/Texte zugewiesen:
Q:700""
L:701"Difference in length"
C:702"Difference in contents"
D:703"Difference in length&contents"
A:704Fehlermeldung 205: Objekt nicht gefunden
B:705Fehlermeldung 205: Objekt nicht gefunden
S:706"A is a truncated version of B"
T:707"B is a truncated version of A"
O:708"Difference in comment"
P:709"Difference in protection bits"
W:212Fehlermeldung 212: Objekt ist nicht vom geforderten Typ
E:xxxFehlermeldung xxx
0:800Fehlermeldung 212: Objekt ist nicht vom geforderten Typ (A=DIR, B=FILE)
1:801Fehlermeldung 212: Objekt ist nicht vom geforderten Typ (A=FILE, B=DIR)
2:802Fehlermeldung 205: Objekt nicht gefunden (A=DIR, B=-)
3:803Fehlermeldung 205: Objekt nicht gefunden (A=FILE, B=-)
4:804Fehlermeldung 205: Objekt nicht gefunden (A=-, B=DIR)
5:805Fehlermeldung 205: Objekt nicht gefunden (A=-, B=FILE)
6:806Fehlermeldung 205: Objekt nicht gefunden (A=NEWDIR)
7:807Fehlermeldung 205: Objekt nicht gefunden (A=NEWFILE)
8:808Fehlermeldung 205: Objekt nicht gefunden (B=NEWDIR)
9:809Fehlermeldung 205: Objekt nicht gefunden (B=NEWFILE)

Wie in C üblich, können die Optionen noch spezifiziert werden. Dies geschieht durch das Einfügen von Format-Optionen zwischen "%" und der Option.

Eine Zahl gibt an, wieviele Zeichen lang diese Option dargestellt werden soll. Wenn die Zahl negativ ist, erfolgt die Ausgabe linksbündig, sonst rechtsbündig.

Mit der vorangestellten Format-Option "!" wird die Ausgabe auf die Breite der folgenden Zahl gekürzt. Im Falle von %p,%t,%P,%T wird links abgeschnitten, bei %n,%e rechts. Bei %E,%r wird diese Option ignoriert.


History

2.02000-11-26
  • PROTBITS hinzugefügt
  • cmp is now GIFTWARE/MAILWARE
  • Lokalisiert (benötigt jetzt OS 2.1)
  • Deutscher Catalog verfügbar
  • Support-Seite: http://www.kazik.de/alex/cmp
1.92000-10-08
  • COMMENT hinzugefügt
  • Dokumentformat nach HTML gewechselt
1.82000-02-11
  • Dokumentation aktualisiert
1.72000-01-25
  • DETAIL (S/T Ergebnisse) verbessert
1.6-internal-
  • DETAIL, NEWDIR, NEWFILE, REVADIR, REVBDIR, DUMPALL, SKIPFIRSTNBYTES hinzugefügt
1.51999-04-07
  • Die 020-Version ist nun resistentfähig (nützlich bei EqFiles.rexx)
  • Benutzen Sie "lha x -a" zum Entpacken des Archives, oder "protect cmp p add" um es resistentfähig zu machen
  • E-Mail/HomePage hat sich geändert!
1.41997-05-21
  • Ausgabe einer Statistik beim Vergleich zweier Verzeichnisse
  • Die Option NOSTAT schaltet die Statistik aus
  • Die Option NORC hinzugefügt
  • Zwei 68000er Fehler behoben
1.31997-04-16
  • Einen neu hinzugekommenen Bug behoben
  • 68000er Version wieder hinzugefügt (V1.2 war nur 020+)
  • Ausgabe noch etwas farbiger gemacht
  • Das Guide/Readme korrigiert
  • Wenn zwei Dateien gleich lang sind und das Datum identisch ist, werden sie als gleich angesehen
1.21997-04-10
  • Kleinen Bug behoben
  • Mit StormC und der stormamiga.lib rekompiliert (kleiner & schneller)
1.11997-02-28
  • Verbesserung der Option DUMP
1.01997-02-18
  • Erste Veröffentlichung



Danke an...

Andreas Mayer-Gürr
für's Korrekturlesen des Guides und beta testing

Nils Goers
für 'ne Idee für die Option DUMP

Fulvio Peruggi
für einige Bug-Reports und die Idee mit der Farbe, beta testing, viele weitere Ideen und für's Korrekturlesen

Matthias Henze
für die stormamiga.lib, welche ich seit V1.2 benutze

Simon N Goodwin
für die Idee mit dem Datum-Vergleich

Henry Sopko
für 68000er beta testing

Thomas Chen
für die Idee mit dem Kommentar/Schutzbits-Vergleich


Dump Example

DUMP: Disk.info                   Test.info                   
0010: 00000002 00000A40 .......@  00000002 0000099B ........
0018: 00000CBF 00000106 ...¿....  000001B6 00000017 ......
0020: 000003E9 00000A40 ...é...@  000003E9 0000099B ...é....
0028: 2C780004 2A4F226E ,x..*O"n  48E77EFE 24482400 Hç~þ$H$.
0030: 01144AA9 00AC6652 ..J©.¬fR  49F90000 00002C78 Iù....,x
0038: 41E9005C 2F084EAE Aé.\/.N®  000447F9 000005AC ..Gù...¬
Disk.info: Found 31 differences in contents&length until abort



Complex Example

Here is a complex example, how to use cmp as an updater. The following ARexx script will modify the B-Tree that it is exactly like the A-Tree. Only all changed files will copied. It is an ARexx-Script, and it's (hopefully) a help. Without DETAIL it's not possible to distinguish between (missing/useless) dirs and files. More information at the end of the following listing. This is the listing of "update1.rexx".
/*
** Update only all neccesary files from dir A -> dir B
**                 ©1999/2000 ALeX Kazik
*/

/* IMPORTANT: the src/dst dir MUST end with a colon or slash and MUST NOT be empty! */

/* SOURCE directory */
src = 'a/'

/* DESTINATION directory */
dst = 'b/'

/* the script to create, and which will be executed */
script = 'T:script'

/* SKIP the first N bytes */
skip = 0

/* temporary file */
tmpfile = 'T:update.tmp'

/*
** The main-program
*/

ADDRESS COMMAND

cmp 'A="' || src || '" B="' || dst || '" all nostat norc skipfirstnbytes=' || SKIP ,
    || ' newdir=10 newfile revbdir detail lformat %r%R%n >"' || TMPFILE || '"'
IF RC >= 20 THEN DO
	SAY 'Error while executing cmp'
	EXIT RC
END

CALL OPEN(tmp, tmpfile, 'read')
CALL OPEN(scr, script, 'write')

eq = 0

DO UNTIL EOF(tmp)
  act = READCH(tmp, 1)
  file = READLN(tmp)
  IF act = '' THEN
    BREAK
  ELSE IF act = 'Q' THEN
    eq = eq + 1
  ELSE IF (act = 'A') | (act = '5') | (act = '9') THEN DO
    SAY 'File to remove: ' || file
    CALL WRITELN(scr, 'delete "' || dst || file || '" quiet')
  END
  ELSE IF (act = '4') | (act = '8') THEN DO
    SAY 'Dir to remove: ' || file
    CALL WRITELN(scr, 'delete "' || dst || file || '" quiet')
  END
  ELSE IF (act = 'B') | (act = '3') | (act = '7') THEN DO
    SAY 'New File: ' || file
    CALL WRITELN(scr, 'copy "' || src || file || '" "' || dst || file || '"')
  END
  ELSE IF (act = '2') | (act = '6') THEN DO
    SAY 'New Dir: ' || file
    CALL WRITELN(scr, 'makedir "' || dst || file || '"')
  END
  ELSE IF (act = 'E') | (act = '0') | (act = '1') THEN DO
    SAY 'Error/Warning at dir/file: ' || file
    EXIT 20
  END
  ELSE IF (act = 'L') | (act = 'C') | (act = 'D') | (act = 'S') | (act = 'T') THEN DO
    SAY 'File to Update: ' || file
    CALL WRITELN(scr, 'copy "' || src || file || '" "' || dst || file || '"')
  END
  ELSE DO
    SAY 'Unknown Symbol >' || act || '<'
    CALL CLOSE(tmp)
    CALL CLOSE(scr)
    EXIT 20
  END
END

SAY eq || ' Equal files.'

CALL CLOSE(tmp)
CALL CLOSE(scr)

/*
** executing the changes
*/

execute '"' || script || '"'

/*
** That's all.
*/

Ok. Did you now understand, for what I've created NEWDIR/NEWFILE? Not? Just remove DETAIL and examine the created files against those before...

REVBDIR is used here, because the entries of a directory should be removed before the directory can be removed.

This is only the simple version. The more powerful version can be found here: "update2.rexx".

That version is also able to generate a FTP-Script, I use it to update my web-pages.

©2000 ALeX Kazik · last update 26-Nov-2000